const obj = {
  name: 'why',
  age: 18
}

// Object.defineProperty(obj, 'name', {
//   get: function() {
//     console.log('监听到 obj 对象的 name 属性被访问')
//   },
//   set: function() {
//     console.log('监听到 obj 对象的 name 属性被赋值')
//   }
// })

Object.keys(obj).forEach(key => {
  let val = obj[key]
  Object.defineProperty(obj, key, {
    get: function() {
      console.log(`监听到 obj 对象的 ${key} 属性被访问`)
      return val
    },
    set: function(newVal) {
      console.log(`监听到 obj 对象的 ${key} 属性被赋值`)
      val = newVal
    }
  })
})

console.log(obj.name)
obj.name = 'kobe'
console.log(obj.name)

// 缺点：对于新增属性、删除属性来说， Object.defineProperty 是无能为力的